home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1999 Spring / macformat-077.iso / Shareware Plus / Development / SpriteWorld 2.2 Extra Demos / User Contributions / ButtonBreakOut ƒ / ButtonSprite / ButtonSprite.c next >
Encoding:
Text File  |  1998-12-22  |  10.5 KB  |  244 lines  |  [TEXT/CWIE]

  1. // ButtonSprite.c  [DB] mod v1.1
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. #include "SWIncludes.h"
  7. #include "ButtonSprite.h"
  8. #define kAreControlsDraggable    true        //Allows user to drag buttons around by holding cmd key down
  9.                                             //Make it false when you do your final compile so end users can't mess with your interface
  10.  
  11. #define kGridSize                1 /*25*/    //This creates a 'grid' that your controls stick to when you drag them using the cmd key.  [DB]:set to 1
  12.                                             //Make it 1 to turn off the grid. ***DONT*** make it 0 or you will get a Div by 0 error.
  13.  
  14. int                                gMouseButton, gDraggable, gKeyControlTracking, gTrackingMouse, gMoveButtonX, gMoveButtonY;
  15. Point                            gCursorPt;
  16. CursPtr                            gNotOverAButtonCursor, gOverAButtonCursor;
  17. SetButtonCursorProcPtr            gSetButtonCursorProc;
  18. EventRecord                        gTheEvent;
  19. Boolean                            gButtonsAreActive;        // [DB]
  20. Boolean                            gShowDraggedPosition;    // [DB]
  21.  
  22.  
  23.     // Call once to set up; the Proc is the routine which has the opportunity to adjust cursor when 
  24.     // mouse is over a button (it receives a boolean which says this) [DB]
  25.  
  26. void SWGInitButtonSpriteWorld(SetButtonCursorProcPtr SetButtonCursorProc)
  27. {
  28.     gSetButtonCursorProc = SetButtonCursorProc;
  29.     gMouseButton = kCursorUp;
  30.     gDraggable = false;
  31.     GetMouse(&gCursorPt);
  32.     gKeyControlTracking = false;
  33.     gTrackingMouse = false;
  34.     gButtonsAreActive = kAreControlsDraggable;            // [DB]
  35.     gShowDraggedPosition = true;                        // [DB]
  36. }
  37.  
  38.  
  39.     // Call repeatedly to operate; but not more than once per SW frame [DB]
  40.  
  41. void SWGUpdateButtonData(void)
  42. {
  43.     if (Button() && gButtonsAreActive)                // [DB] simple inhibitor (also inhibits mouse tracking, see below)
  44.     {
  45.         if (gMouseButton==kCursorUp) gMouseButton=kCursorInitDown; else gMouseButton=kCursorDown;
  46.     }
  47.         else gMouseButton=kCursorUp;
  48.     
  49.     (*gSetButtonCursorProc)(gTrackingMouse);
  50.  
  51.     if (kAreControlsDraggable)
  52.     {
  53.         if (OSEventAvail(0, &gTheEvent)) {}            /* we dont care if its true or false */
  54.  
  55.         gDraggable = ((gTheEvent.modifiers & cmdKey) != 0);                    // [DB]≠
  56.         gShowDraggedPosition = ((gTheEvent.modifiers & optionKey) != 0);    // [DB]
  57.     }
  58.  
  59.     GetMouse(&gCursorPt);
  60.     gKeyControlTracking=false;
  61.     gTrackingMouse=false;
  62. }
  63.  
  64.  
  65.     // All drawing functions for this button, and the attached action, are declared in one fell swoop [DB]
  66.  
  67. void SWGSetUpButtonCallbacks(ButtonSpritePtr srcButtonP, ButtonProcPtr DrawButtonUp, 
  68.                             ButtonProcPtr DrawButtonMouseOver, ButtonProcPtr DrawButtonDown, 
  69.                             ButtonProcPtr DrawButtonDisabled, MoveProcPtr ButtonAction)
  70. {
  71.     srcButtonP->DrawButtonUp=DrawButtonUp;                        // for drawing state 0
  72.     srcButtonP->DrawButtonMouseOver=DrawButtonMouseOver;        // for drawing state 1
  73.     srcButtonP->DrawButtonDown=DrawButtonDown;                    // for drawing state 2
  74.     srcButtonP->DrawButtonDisabled=DrawButtonDisabled;            // for drawing state 3
  75.     srcButtonP->ButtonAction=ButtonAction;                        // action attached to this button
  76.     srcButtonP->LastButtonState=-1;                                // force the button to redraw
  77. }
  78.  
  79.  
  80.     // Yep.
  81.  
  82. void SWGEnableButton(ButtonSpritePtr srcButtonP, int IsButtonEnabled)
  83. {
  84.     srcButtonP->IsButtonEnabled=IsButtonEnabled;
  85. }
  86.  
  87.  
  88.     // This is the catch -- allows repositioning the button sprite.  [DB]
  89.     // This is an actual move proc; like the other SW move procs, is called by SW to do a move.
  90.     // If not draggable, may activate the button action.
  91.  
  92. pascal void ButtonMoveProc(SpritePtr srcSpriteP)
  93. {
  94.     if (srcSpriteP->isVisible)
  95.     {    
  96.         if ((!((ButtonSpritePtr)srcSpriteP)->MenuKeyPressed)&&(!gKeyControlTracking))
  97.         {
  98.             if ((((ButtonSpritePtr)srcSpriteP)->IsButtonEnabled)||(gDraggable))
  99.             {
  100.                     // state 0  [DB]
  101.                 if (gMouseButton==kCursorUp)
  102.                 {
  103.                     if (((ButtonSpritePtr)srcSpriteP)->TrackingMouse)
  104.                     {
  105.                         if (SWIsPointInSprite(srcSpriteP,gCursorPt) && gButtonsAreActive) // Button has been unclicked in active button +[DB]
  106.                         {
  107.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)!=NULL)
  108.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonMouseOver));    //Call the buttons draw proc for a Mouse Over
  109.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonMouseOver;
  110.                             gTrackingMouse=true;
  111.                             if (!gDraggable) (*((ButtonSpritePtr)srcSpriteP)->ButtonAction)(srcSpriteP);    // Do Button
  112.                         }
  113.                         else
  114.                         {
  115.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)!=NULL)
  116.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonUp));    // mouse outside of button
  117.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonUp;
  118.                         }
  119.                     }
  120.                     else
  121.                     {
  122.                         if (SWIsPointInSprite(srcSpriteP,gCursorPt) && gButtonsAreActive)    // +[DB]
  123.                         {
  124.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)!=NULL)
  125.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonMouseOver));    // mouse inside of button
  126.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonMouseOver;
  127.                             gTrackingMouse=true;
  128.                         }
  129.                         else
  130.                         {
  131.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)!=NULL)
  132.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonUp));    // mouse outside of button
  133.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonUp;
  134.                         }
  135.                     }
  136.                     ((ButtonSpritePtr)srcSpriteP)->TrackingMouse=false;
  137.                 }
  138.                     // state 1  [DB]
  139.                 else if (gMouseButton==kCursorDown)
  140.                 {
  141.                     if (((ButtonSpritePtr)srcSpriteP)->TrackingMouse)
  142.                     {
  143.                         if (((SWIsPointInSprite(srcSpriteP,gCursorPt))||(gDraggable)) && gButtonsAreActive) // +[DB]
  144.                         {
  145.                             if (gDraggable)
  146.                             {
  147.                                 gMoveButtonX=((ButtonSpritePtr)srcSpriteP)->TrackingMouseXInit+(short)(((short)gCursorPt.h-(short)((ButtonSpritePtr)srcSpriteP)->TrackingMouseX));
  148.                                 gMoveButtonY=((ButtonSpritePtr)srcSpriteP)->TrackingMouseYInit+(short)(((short)gCursorPt.v-(short)((ButtonSpritePtr)srcSpriteP)->TrackingMouseY));
  149.                                 gMoveButtonX=((gMoveButtonX+(kGridSize/2))/(kGridSize))*(kGridSize);
  150.                                 gMoveButtonY=((gMoveButtonY+(kGridSize/2))/(kGridSize))*(kGridSize);
  151.                                 SWMoveSprite(srcSpriteP, gMoveButtonX, gMoveButtonY);
  152.                                 // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
  153.                                 // [DB]  Optionally show the sprite's position while it is being dragged
  154.                                 // systematically save//restore any window settings (no optimization needed)
  155.                                 if (gShowDraggedPosition)
  156.                                 {
  157.                                     char     str [256];
  158.                                     UInt16    font;
  159.                                     UInt16    mode;
  160.                                     UInt16    size;
  161.                                     // NOTE: fast, easy and not-so-dirty bamboozling of pascal string
  162.                                     sprintf (str, "• %d %d ", gMoveButtonX, gMoveButtonY);    // include a char for the pascal length byte
  163.                                     str [0] = strlen (str) - 1;                                // suddenly it's compatible with a pascal string
  164.                                     MoveTo (srcSpriteP->destFrameRect.left + 3, srcSpriteP->destFrameRect.bottom - 3);
  165.                                     font = qd.thePort->txFont;
  166.                                     size = qd.thePort->txSize;
  167.                                     mode = qd.thePort->txMode;
  168.                                     TextMode (srcCopy);
  169.                                     TextFont (kFontIDGeneva);
  170.                                     TextSize (9);
  171.                                     DrawString ((unsigned char *) str);
  172.                                     TextMode (mode);
  173.                                     TextFont (font);
  174.                                     TextSize (size);
  175.                                 }
  176.                                 // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
  177.                             }
  178.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonDown)!=NULL)
  179.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonDown)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonMouseDown));    // Button is tracking in active button
  180.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonMouseDown;
  181.                             gTrackingMouse=true;
  182.                         }
  183.                         else
  184.                         {
  185.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)!=NULL)
  186.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonMouseOver)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonMouseOver));    // Button is tracking out of active button
  187.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonMouseOver;
  188.                         }
  189.                     }
  190.                     else
  191.                     {
  192.                         if (SWIsPointInSprite(srcSpriteP,gCursorPt) && gButtonsAreActive)    // +[DB]
  193.                         {
  194.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)!=NULL)
  195.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonUp));    // mouse inside of button (but tracked by a different button) 
  196.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonUp;
  197.                         }
  198.                         else
  199.                         {
  200.                             if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)!=NULL)
  201.                                 (*((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonUp));    // mouse outside of button
  202.                             ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonUp;
  203.                         }
  204.                     }
  205.                 }
  206.                     // state 2  [DB]
  207.                 else if (gMouseButton==kCursorInitDown)
  208.                 {
  209.                     if (SWIsPointInSprite(srcSpriteP,gCursorPt) && gButtonsAreActive)    // +[DB]
  210.                     {
  211.                         if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonDown)!=NULL)
  212.                             (*((ButtonSpritePtr)srcSpriteP)->DrawButtonDown)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonMouseDown));    // mouse init clicked inside of button
  213.                         ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonMouseDown;
  214.                         ((ButtonSpritePtr)srcSpriteP)->TrackingMouse=true;                                        // start button tracking
  215.                         gTrackingMouse=true;
  216.                         if (gDraggable)
  217.                         {
  218.                             ((ButtonSpritePtr)srcSpriteP)->TrackingMouseX=gCursorPt.h;                                // lets move the control around!
  219.                             ((ButtonSpritePtr)srcSpriteP)->TrackingMouseY=gCursorPt.v;
  220.                             ((ButtonSpritePtr)srcSpriteP)->TrackingMouseXInit=srcSpriteP->destFrameRect.left;
  221.                             ((ButtonSpritePtr)srcSpriteP)->TrackingMouseYInit=srcSpriteP->destFrameRect.top;
  222.                         }
  223.                     }
  224.                     else
  225.                     {
  226.                         if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)!=NULL)
  227.                             (*((ButtonSpritePtr)srcSpriteP)->DrawButtonUp)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonUp));    // mouse init clicked outside of button 
  228.                         ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonUp;
  229.                     }
  230.                 }
  231.             }
  232.                 // state 3  [DB]
  233.             else
  234.             {
  235.                 if ((((ButtonSpritePtr)srcSpriteP)->DrawButtonDisabled)!=NULL)
  236.                     (*((ButtonSpritePtr)srcSpriteP)->DrawButtonDisabled)((ButtonSpritePtr)srcSpriteP, !(((ButtonSpritePtr)srcSpriteP)->LastButtonState==kButtonDisabled));    // this button is dimmed and cannot be clicked on 
  237.                 ((ButtonSpritePtr)srcSpriteP)->LastButtonState=kButtonDisabled;
  238.             }
  239.         }
  240.     }
  241. }
  242.  
  243. // end  [DB]
  244.